package tree

// TreeNode 定义部门树节点
type TreeNode struct {
	ID       int64       `json:"id"`
	Label    string      `json:"label"`
	Children []*TreeNode `json:"children"`
}

// DeptTreeDto 数据库实体
type DeptTreeDto struct {
	DeptId   int64  `xorm:"pk" json:"deptId" form:"deptId"`
	DeptName string `json:"deptName" form:"deptName"`
	ParentId int64  `json:"parentId" form:"parentId"`
}

func (m *DeptTreeDto) TableName() string {
	return "sys_dept"
}

// GetDeptTree 获取部门树
func GetDeptTree(departments []*DeptTreeDto) []*TreeNode {
	// 创建根节点切片
	rootNodes := []*TreeNode{}
	// 创建部门ID映射表
	departmentMap := make(map[int64]*TreeNode)

	// 先遍历一次部门列表，根据部门ID创建节点并添加到映射表中
	for _, dep := range departments {
		node := &TreeNode{
			ID:    dep.DeptId,
			Label: dep.DeptName,
		}
		departmentMap[dep.DeptId] = node
	}

	// 再遍历一次部门列表，构建树结构
	for _, dep := range departments {
		// 如果当前部门是根节点，则直接加入根节点切片中
		if dep.ParentId == 0 {
			rootNodes = append(rootNodes, departmentMap[dep.DeptId])
		} else {
			// 否则，将当前部门添加到其父节点的子节点切片中
			parent := departmentMap[dep.ParentId]
			parent.Children = append(parent.Children, departmentMap[dep.DeptId])
		}
	}

	return rootNodes
}
